#include <REGX52.H>
#include "Timer0.h"


//高电平和低电平持续时间所占总时间的百分比，即占空比，即PWM。

void breatheLED();		//呼吸灯主程序的函数声明 

//PWM周期20ms，分成100份，定时器定时时间就为20ms/100 = 200us
unsigned int T0Count = 0;    //一个PWM周期内的：周期计数
unsigned int dutyfactor = 0; //一个PWM周期内的：占空比
unsigned int direct = 0;     //一个PWM周期内的：方向


void main()
{
	Timer0_Init();	//中断函数初始化
	while(1)
	{
		breatheLED();	
	}
	
}

//-----------------------------------------------------
void Timer0_Routine() interrupt 1  //定时器0的中断函数
{
	//1ms定时
	TL0 = 0x48;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	T0Count++;
	
//	if(T0Count>=20)  //20ms定时
//	{
//		//清零重记次
//		breatheLED();
//		T0Count=0;
//	}
}

//---------------------------------------------------

void breatheLED()     //呼吸灯主程序
	{
		if(T0Count>=100) //200us*100=200ms，一个PWM周期
		{
			T0Count = 0;
		
		
			//根据方向判断占空比增加或减少
			if(direct == 0) {			//正方向，占空比增加
				dutyfactor++;			//下一个PWM周期，占空比增加1
			} else if(direct == 1) {	//负方向，占空比减少
				dutyfactor--;			//下一个PWM周期，占空比减少1
			}
		}

		
		//根据占空比值判断方向是否需要改变
		if(dutyfactor <= 1) {			//占空比减少到0
			direct = 0;					//正方向，占空比开始增加
		} else if(dutyfactor >= 100) {	//占空比增加到100
			direct = 1;					//负方向，占空比开始减少
		}
		
		//占空比：通电时间相对于总时间所占的比例（此程序中：低电平时间相对于PWM周期所占的比例） 
		//一个PWM周期计数100次，占空比相当于低电平的计数周期次数。
		//即：0~占空比：低电平，灯亮；占空比~100：高电平，灯灭 
		//在一个PWM周期内，根据周期计数是否小于占空比，判断LED灯的亮灭
		if(T0Count < dutyfactor) {		//周期计数值<占空比
			P2 = 0x00;					//当前PWM周期的当前计数周期内灯亮
		} else {
			P2 = 0xFF;					//当前PWM周期的当前计数周期内灯灭
		}
}
	


